package persistence;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import persistence.PoolConexiones;
import model.*;

public class PersistenciaServicio {
	
	private static PersistenciaServicio instancia;
	
	public static PersistenciaServicio getInstancia()
	{
		if (instancia== null)
			instancia =new PersistenciaServicio();
		return instancia;
	}

	public Servicio getServicio(Integer id_cotiz) //HECHO
	{
		Servicio s = null; 
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		
		try
		{
			String senten = "SELECT id, nombre, fecha_in, fecha_out, descripcion, "
					+ "cant_noches, id_hotel "
					+ "FROM Servicio "
					+ "WHERE id = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,id_cotiz);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{						
				s = new Servicio(
						result.getInt("id")
						, result.getString("nombre")
						, result.getDate("fecha_in")
						, result.getDate("fecha_out")
						, result.getString("descripcion")
						,result.getInt("cant_noches")
						, PersistenciaHotel.getInstancia().getHotel(result.getInt("id_hotel"))
						, PersistenciaItemServicio.getInstancia().getItems(result.getInt("id"))
						, this.getOcupaciones()
						);
			}			
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al consultar Servicio: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	      return s;
	}
	
	public ArrayList<Servicio> getServicios(Integer id_cotiz) //HECHO
	{
		Servicio s = null; 
		ArrayList<Servicio> listaServicios = new ArrayList<Servicio>();
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		try
		{
			String senten = "SELECT id, nombre, fecha_in, fecha_out, descripcion, "
					+ "cant_noches, id_hotel "
					+ "FROM Servicio "
					+ "WHERE id_cotiz = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, id_cotiz);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{						
				s = new Servicio(
						result.getInt("id")
						, result.getString("nombre")
						, result.getDate("fecha_in")
						, result.getDate("fecha_out")
						, result.getString("descripcion")
						, result.getInt("cant_noches")
						, PersistenciaHotel.getInstancia().getHotel(result.getInt("id_hotel"))
						, PersistenciaItemServicio.getInstancia().getItems(result.getInt("id"))
						, this.getOcupaciones()
						);
				listaServicios.add(s);
			}			
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			return listaServicios;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al consultar Servicios: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	      return listaServicios;
	}
	
	public Servicio guardarServicio(Servicio s, int id_cotiz) //HECHO
	{
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		String senten = null;
		try
		{
			senten = "UPDATE Servicio SET "
					+ "id_cotiz = ?,"
					+ "nombre = ?,"
					+ "fecha_in = ?,"
					+ "fecha_out = ?,"
					+ "descripcion = ?,"
					+ "cant_noches = ?,"
					+ "id_hotel = ? "
					+ "WHERE id = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, id_cotiz);
			ps.setString(2, s.getNombre());
			ps.setDate(3, new java.sql.Date(s.getFechaDesde().getTime()));
			ps.setDate(4, new java.sql.Date(s.getFechaHasta().getTime()));
			ps.setString(5, s.getDescripcion());
			ps.setInt(6, s.getCantNoches());
			ps.setInt(7, s.getHotel().getId());
			ps.setInt(8, s.getId());
			ps.executeUpdate();
			con.commit();			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			
			//elimina los items de servicio
			for(ItemServicio item : s.getItems()){
				PersistenciaItemServicio.getInstancia().eliminarItemServicio(item);
			}
			
			//inserta items de servicio
			for(ItemServicio item : s.getItems()){
				PersistenciaItemServicio.getInstancia().insertItemServicio(item, s.getId());
			}
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al actualizar Servicio: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
		return s;
	}

	public Servicio insertServicio(Servicio s, Integer id_cotiz) //
	{
		int newId=0;
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		String senten = null;
		
		//inserta items de servicio
		for(ItemServicio item : s.getItems()){
			PersistenciaItemServicio.getInstancia().insertItemServicio(item, s.getId());
		}
		
		try
		{					
			senten = "INSERT INTO Servicio (id_cotiz, nombre, fecha_in, fecha_out, "
					+ "descripcion, cant_noches, id_hotel) "
					+ "VALUES (?,?,?,?,?,?,?)";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten, Statement.RETURN_GENERATED_KEYS);
			ps.setInt(1, id_cotiz);
			ps.setString(2, s.getNombre());
			ps.setDate(3, new java.sql.Date(s.getFechaDesde().getTime()));
			ps.setDate(4, new java.sql.Date(s.getFechaHasta().getTime()));
			ps.setString(5, s.getDescripcion());
			ps.setInt(6, s.getCantNoches());
			ps.setInt(7, s.getHotel().getId());
			ps.execute();
			ResultSet  generatedKeys = ps.getGeneratedKeys();
			if(generatedKeys.next())
			{	
				newId = generatedKeys.getInt(1);
			}
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			s.setId(newId);
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al Insertar Servicio: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
		return s;
	}
	
	public void eliminarServicio(Servicio s) //HECHO
	{
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		
		//elimina los items de servicio
		for(ItemServicio item : s.getItems()){
			PersistenciaItemServicio.getInstancia().eliminarItemServicio(item);
		}
			
		
		try
		{
			String senten = "DELETE FROM Servicio "
					+ "WHERE id = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,s.getId());	
			ps.executeUpdate();
			con.commit();
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al eliminar Servicio: " + e.getMessage());
				e.printStackTrace();
				try{
					if(con!=null)
			            con.rollback();
				}catch( SQLException e2){
					e2.printStackTrace();
				}
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	}

	public ArrayList<Integer> getOcupaciones()
	{
		ArrayList<Integer> ocupaciones = new ArrayList<Integer>();
		return ocupaciones;
	}
}
